package com.bluebridgecup.BasicAlgorithms.twoDimensionPrefixSumAndDifference;

import java.io.*;
import java.util.*;

// 类名：PrefixSumQuery，表示前缀和查询相关功能
public class PrefixSumQuery {
    static int N = 1010;
    static int[][] a = new int[N][N];
    static int[][] s = new int[N][N];
    static FastReader in = new FastReader();
    static PrintWriter out = new PrintWriter(System.out);

    public static void main(String[] args) {
        solve();
        out.flush();
    }

    // solve方法：核心处理逻辑方法
    // 功能：读取输入数据，构建二维数组的前缀和数组，然后根据查询进行结果输出
    static void solve() {
        // 从输入读取n，代表二维数组的行数
        int n = in.nextInt();
        // 从输入读取m，代表二维数组的列数
        int m = in.nextInt();
        // 从输入读取q，代表查询的次数
        int q = in.nextInt();
        // 遍历二维数组的每一行
        for (int i = 1; i <= n; i++) {
            // 遍历当前行的每一列
            for (int j = 1; j <= m; j++) {
                // 读取二维数组a在(i, j)位置的元素值
                a[i][j] = in.nextInt();
                // 计算二维数组s在(i, j)位置的前缀和，
                // 计算方式为当前元素值加上其左边元素的前缀和、上边元素的前缀和，
                // 再减去左上角元素的前缀和（避免重复计算）
                s[i][j] = a[i][j] + s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1];
            }
        }
        // 进行q次查询
        while (q-- > 0) {
            // 读取查询的左上角坐标(x1, y1)
            int x1 = in.nextInt();
            int y1 = in.nextInt();
            // 读取查询的右下角坐标(x2, y2)
            int x2 = in.nextInt();
            int y2 = in.nextInt();
            // 根据前缀和数组s，计算并输出指定区域的元素和
            // 计算方式为右下角前缀和减去上边区域前缀和、左边区域前缀和，
            // 再加上左上角区域前缀和（消除重复减去的部分）
            out.println(s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]);
        }
    }

    static class FastReader {
        static BufferedReader br;
        static StringTokenizer st;

        FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() {
            String str = "";
            while (st == null || !st.hasMoreElements()) {
                try {
                    str = br.readLine();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                st = new StringTokenizer(str);
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        double nextDouble() {
            return Double.parseDouble(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }
    }
}